#pragma once

#include <string>
#include <Eigen/Dense>

namespace  ldl_eigen
{
class FashionMnistLoad
{
public:
    FashionMnistLoad(const std::string& resource_dir);
    int64_t load();

    const Eigen::MatrixXi get_train_images();
    const Eigen::VectorXi get_train_labels();
    const Eigen::MatrixXi get_test_images();
    const Eigen::VectorXi get_test_labels();

    const Eigen::MatrixXf get_one_hot_train_labels();
    const Eigen::MatrixXf get_one_hot_test_labels();

    const Eigen::MatrixXf get_normalized_train_images();
    const Eigen::MatrixXf get_normalized_test_images();

private:
    Eigen::MatrixXi load_images(const std::string& path, int max_items = -1);
    Eigen::VectorXi load_labels(const std::string& path, int max_items = -1);
private:
    std::string resource_dir_{};
    Eigen::MatrixXi train_images_{};
    Eigen::VectorXi train_labels_{};
    Eigen::MatrixXi test_images_{};
    Eigen::VectorXi test_labels_{};

    Eigen::MatrixXf normalized_train_images_{};
    Eigen::MatrixXf normalized_test_images_{};

    Eigen::MatrixXf one_hot_train_labels_{};
    Eigen::MatrixXf one_hot_test_labels_{};
};
}
